package main

import (
	"fmt"
	"time"
)

// 通道 channel
// 通道（channel）可以在多个 goroutine 之间安全的传值。
// 通道可以用作变量、函数参数、结构体字段…
// 创建通道用 make 函数，并指定其传输数据的类型
//  c := make(chan int)
/**********************************************************/
// 使用左箭头操作符 <- 向通道发送值 或 从通道接收值
// 向通道发送值：c <- 99
// 从通道接收值：r := <- c

func main() {
	// 创建通道 传输 int 类型的值
	c := make(chan int)
	for i := 0; i < 5; i++ {
		go sleepyGopher(i, c)
	}

	for i := 0; i < 5; i++ {
		fmt.Println("准备从通道中取值", i)
		// 取值的时候要等通道内先被放入一个值，所以此处先打印出来 从通道中取值0，
		// 然后3秒钟之后通道中存入了一个值，接着这边就可以取出来了
		gopherID := <-c
		fmt.Println("gopher ", gopherID, " has finished sleeping")
	}

}

func sleepyGopher(id int, c chan int) {
	time.Sleep(3 * time.Second)
	fmt.Println("... ", id, " snore ...")
	fmt.Println("准备向通道中存入", id)
	c <- id
}
